import md5 from 'js-md5'
import { cloneDeep } from 'lodash'

// 分辨率
export const screen = window.screen.width + 'x' + window.screen.height

//#region 请求签名
export function signTxt(parms) {
  const appSecret = process.env.VUE_APP_SECRET
  if (parms && Object.keys(parms).length > 0) {
    let arr = []
    for (let key in parms) {
      if (parms[key] !== undefined) arr.push(key)
    }
    arr.sort() //字典排序
    let str = ''
    for (let i in arr) {
      let parmsVal = parms[arr[i]]
      if (typeof parmsVal == 'object') {
        if (parmsVal == null) {
          str += arr[i]
        } else {
          let r = JSON.stringify(parmsVal)
            .split('')
            .sort()
            .join('')
          str += arr[i] + r
        }
      } else {
        if (parmsVal.toString() != '') {
          str += arr[i] + parmsVal
        }
      }
    }
    return md5(str + appSecret)
  } else return md5(appSecret)
}
//#endregion

//#region 生成随机字符
export const random = () =>
  Math.random()
    .toString(36)
    .substr(2)

export const randomString = len => {
  len = len || 32
  let t = '0123456789abcdefghijklmnopqrstuvwxyz', //ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    l = t.length,
    r = ''
  for (let i = 0; i < len; i++) r += t.charAt(Math.floor(Math.random() * l))
  return r
}
//#endregion

//#region map筛选过滤
export function mapfilter(options) {
  return options.map(m => ({ value: m.value.toString(), text: m.text }))
}
//过滤选项
export const filterOption = (input, option) => option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
//#endregion

//#region 防抖
/**
 * 概念：触发事件后在N秒内函数只执行一次，若在N秒内再次触发则重新计算。如下拉触底加载下一页
 * @param {*} func 执行函数
 * @param {*} wait 延迟执行时间（单位毫秒）
 */
export function debounce(func, wait = 300) {
  let timeout //定时器
  return function() {
    if (timeout) clearTimeout(timeout) //取消之前的任务
    timeout = setTimeout(() => {
      func.apply(this, arguments) //执行func函数
    }, wait)
  }
}
//先立即查询，过wait后才能再查询（立即执行）
export function debounces(func, wait = 300) {
  let timeout //定时器
  return function() {
    if (timeout) clearTimeout(timeout) //取消之前的任务
    let callNow = !timeout
    timeout = setTimeout(() => {
      timeout = null //清空当前定时器
    }, wait)
    if (callNow) func.apply(this, arguments) //执行func函数
  }
}
//#endregion

//#region 节流
/**
 * 概念：节省流量，连续发生的事件在N秒内只执行一次函数，如搜索即时查询，固定时间执行
 * @param {*} func 执行函数
 * @param {*} wait 延迟执行时间（单位毫秒）
 */
export function throttle(func, wait = 300) {
  let prev = 0 //记录上次的时间
  return function() {
    let now = Date.now() //当前时间
    if (now - prev > wait) {
      func.apply(this) //执行函数
      prev = now //重置上次的时间
    }
  }
}
//#endregion

//#region 数组转树形结构
/**
 * 根据数组中的父级ID将集合转为树形结构children:[]
 * @param {*} list 源数组
 * @param {*} pid 一级id
 * @param {*} field 父级字段
 */
export function listToTree(list, pid = null, field = 'pid') {
  if (!Array.isArray(list)) throw 'list必须为数组'
  const maps = cloneDeep(list) //克隆一个全新的数组-不改变源数据
  const obj = {}
  maps.forEach(e => {
    obj[e.id] = e
  })
  return maps.filter(item => {
    const p = item[field]
    if (p == pid) return true
    else if (!obj[p]) return false
    ;(obj[p].children || (obj[p].children = [])).push(item)
    return false
  })
}
//#endregion
